<p>Для хранения относительно большого числа объектов в инфоблоке во многих случаях целесообразно воспользоваться  режимом хранения объектов инфоблока в отдельной таблице (технология "Инфоблоки 2.0"). Причем для изменения типа хранения объектов в инфоблоке практически не нужно модифицировать приложение (т.е. в большинстве случаев тип хранения можно поменять и после запуска веб-решения).</p>

<p>Хранение объектов инфоблока в отдельной таблице позволяет существенно уменьшить нагрузку на базу данных, сложность и число SQL-запросов, снизить до минимума операции присоединения таблиц - т.к. значения скалярных свойств объекта инфоблока хранятся в одной записи таблицы. Фактически для каждого инфоблока со своим набором свойств создается отдельная SQL-таблица.</p>

<p>Однако, если ожидается высокая частота запросов к данному инфоблоку с фильтрацией по определенным свойствам, эти свойства хорошо известны на фазе аналитики и проектирования, можно значительно повысить скорость запросов и снизить нагрузку на базу данных если добавить на эти свойства индексы в базе данных. При обновлениях платформы Битрикс добавленные индексы будут сохранены.</p>

<p>Ускоряя выборки из базы данных путем добавления индексов, не следует забывать о необходимости периодической оптимизации таблиц и индексов. Операцию можно выполнять периодически в разделе "Настройки > Инструменты > Оптимизация БД". </p>


<ol>
<li>На этапе проектирования, как правило, принимается решения хранить определенные объекты веб-проекта в инфоблоках 2.0.</li>

<li>После выявления типичных запросов к данным веб-приложения, например: выборка описания товара по его идентификатору (70%), выборка списка товаров в разделе каталога (10%), фильтрация товаров по производителю (5%) и т.п.,  для каждого инфоблока 2.0 определяются свойства, по которым наиболее часто ожидается выполнение фильтрации. Например, в инфоблоке товаров ожидается интенсивная фильтрация по свойству привязки товара к инфоблоку производителей или по дополнительному коду сертификации и т.п.
<br>
Теперь необходимо проверить, что в таблице, хранящей значения свойств инфоблока товаров, имеется индекс на свойство на свойство, хранящее связь с инфоблоком производителей. В разделе "Контент > Информ. блоки > Типы информ. блоков > Товары" находим идентификатор свойства привязки на вкладке "Свойства" (первая колонка "ID") и на вкладке "Инфоблок" находим значение идентификатора инфоблока (свойство "ID"). Затем находим в базе данных таблицу, хранящую значения свойств инфоблока товаров. Таблицы называются по шаблону: "show create table b_iblock_element_prop_s#ИД инфоблока#", например "b_iblock_element_prop_s1" (s - таблица хранит значения скалярных свойств, m - таблица хранит множественные значение свойств).

<br>Теперь нужно проверить, чтобы на нужное нам в таблице свойство был добавлен индекс. Выполняем запрос в разделе "Настройки > Инструменты > SQL запрос" (пример синтаксиса для MySQL):
<br>
<b>show create table b_iblock_element_prop_s1</b>
<br><br>
Возвращается структура таблицы, например:<br><br>
<em>
CREATE TABLE `b_iblock_element_prop_s1` (
  `IBLOCK_ELEMENT_ID` int(11) NOT NULL,
  `PROPERTY_11` text collate utf8_unicode_ci,
  `DESCRIPTION_11` varchar(255) collate utf8_unicode_ci default NULL,
  `PROPERTY_12` decimal(18,4) default NULL,
  `DESCRIPTION_12` varchar(255) collate utf8_unicode_ci default NULL,
  `PROPERTY_13` int(11) default NULL,
  `DESCRIPTION_13` varchar(255) collate utf8_unicode_ci default NULL,
  `PROPERTY_14` int(11) default NULL,
  `DESCRIPTION_14` varchar(255) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`IBLOCK_ELEMENT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci</p>
</em><br>
Свойство привязки хранится в нашем случае, например, в колонке `PROPERTY_13`. Как видим, ключ в таблице пока только один: <br><br>"PRIMARY KEY  (`IBLOCK_ELEMENT_ID`)".<br>

Добавляем индекс на колонку:<br>
<em>alter table b_iblock_element_prop_s1 add index ix_prop13 (PROPERTY_13)</em><br><br>

Теперь выполнив "show create table b_iblock_element_prop_s1" увидим добавленный на свойство индекс:
<br>
<br>
KEY `ix_prop13` (`PROPERTY_13`)
<br>
<br>
Более подробную информацию об индексах в таблице можно получить, выполнив запрос:
"show indexes in b_iblock_element_prop_s1".
Аналогично при необходимости добавляются индексы в таблицу, содержащую множественные значения свойств инфоблока.
Таким образом, необходимо проверить наличие индексов на все интенсивно фильтруемые свойства инфоблоков, хранимых в формате "2.0".<br><br>
</li>
<li>Необходимо удостовериться, что периодически выполняется оптимизация таблиц базы данных (и соответственно индексов) в разделе "Настройки > Инструменты > Оптимизация БД" или средствами системного администрирования (например автоматически). Частота оптимизации определяется объемом хранимых данных и интенсивностью их изменения/добавления. Нередко встречается практика оптимизации всех таблиц базы данных раз в месяц в период минимальной посещаемости веб-проекта.</li>
 </ol>




